import {
  Column,
  CreateDateColumn,
  Entity,
  JoinTable,
  ManyToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { Role } from './role.entity';

@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    length: 50,
    comment: '用户名',
    unique: true,
  })
  username: string;

  @Column({
    length: 50,
    comment: '密码',
  })
  password: string;

  @Column({
    name: 'nick_name',
    length: 50,
    comment: '昵称',
  })
  nickName: string;

  @Column({
    comment: '邮箱',
    length: 50,
  })
  email: string;

  @Column({
    comment: '头像',
    length: 100,
    nullable: true,
  })
  headPic: string;

  @Column({
    comment: '手机号',
    length: 20,
    nullable: true,
  })
  phoneNumber: string;

  @Column({
    comment: '是否冻结',
    default: false,
  })
  isFrozen: boolean;

  @Column({
    comment: '是否是管理员',
    default: false,
  })
  isAdmin: boolean;

  @CreateDateColumn()
  createTime: Date;

  @UpdateDateColumn()
  updateTime: Date;

  /**
   * @ManyToMany(() => Role)
   * 表示 User 实体和 Role 实体之间的关系是多对多的。在多对多关系中，一个 User 可以有多个 Role，同时一个 Role 也可以分配给多个 User
   * () => Role 告诉 TypeORM 目标关系的实体是 Role 。这样 TypeORM 就知道这个关系是多对多的
   *
   *  @JoinTable({ name: 'user_roles' })
   * 在多对多关系中，TypeORM 需要一个中间表（交叉表）来存储关系。在这里，@JoinTable() 指定了 user_roles 作为中间表的表名。
   * name: 'user_roles': 通过 name 选项，我们显式地定义了交叉表的名称为 user_roles。这个表将会存储 User 和 Role 之间的映射关系。
  中间表 user_roles 通常包含两列：一个列保存 User 的主键，另一个列保存 Role 的主键。这样可以在数据库中映射多个用户和多个角色之间的关系。
   */
  @ManyToMany(() => Role)
  @JoinTable({
    name: 'user_roles',
  })
  roles: Role[];

  @Column({
    type: 'int',
    comment: '登录类型, 0 用户名密码登录, 1 Google 登录, 2 Github 登录',
    default: 0,
  })
  loginType: LoginType;
}

export enum LoginType {
  USERNAME_PASSWORD = 0,
  GOOGLE = 1,
  GITHUB = 2,
}
